Option Explicit

'################################################################
' Discriptor
' 列定义接口
'################################################################

'################################################################
' Property
'################################################################
' 返回列名
' 如果当前列是多个列组合成的或是计算列，则返回 ""
Public Property Get Name() As String
End Property

' 返回别名
' 如果当前列是多个列组合成的或是计算列（没有手动设置别名的），则返回 ""
Public Property Get AliasName() As String
End Property

' 返回当前列使用的 DFFilter
' 如果当前列是多个 DFFilter 中的列组合成的，返回 Nothing
' 如果当前列是字面量列，也会返回 Nothing
Public Property Get Filter() As DFFilter
End Property

' 返回当前列的类型
Public Property Get ColType() As DF_DataType
End Property

' 返回当前列的类型处理器
Public Property Get ColTypeHandle() As IDFDataTypeHandler
End Property

'################################################################
' Function
'################################################################

' ------------------------------------------------------
' 列操作
' ------------------------------------------------------
' 获取当前列中使用的所有真实列对象
' @return HashSet<DFFilterSingleCol>
Public Function getRealUsedCol() As ISet
End Function

' 获取当前列中使用的所有 Filter
' @return HashSet<DFFilter>
Public Function getAllFilters() As ISet
End Function

' 返回当前是否是一个字面量列
Public Function isLiteralCol() As Boolean
End Function

' 返回当前是否是一个聚合计算列
' 这里有两种可能
'   1. 对于 IDFFilterAggCol 接口实现类，是聚合计算列
'   2. 对一个聚合计算列进行计算，计算结果仍然是聚合计算列
Public Function isAggregateCol() As Boolean
End Function

' 返回当前是否只使用了一个 Filter 中的列
' 这里有三种可能
'   1. 只使用了一个 Filter 中的列   ---> True
'   2. 使用了多个 Filter 中的列     ---> False
'   3. 字面量列，没有使用任何 Filter 中的列 ---> False
Public Function isUseSingleFilter() As Boolean
End Function

' 检查当前列使用的 DFFilter 是否和指定的 DFFilter 相同
' 如果是同表多列的组合，则默认返回 True
' 如果是多表多列的组合，则默认返回 False
Public Function isSameFilter(ByRef filter As DFFilter) As Boolean
End Function

' 从 DFFilter 中获取当前活动行的数据
' 外部不应该主动调用
Public Function unsafeGetActiveRowVal() As Variant
End Function

' 克隆一个相同的对象
' 字面量计算列 + 真实列不需要克隆，因为这两种无法进行修改
Public Function clone() As IDFFilterCol
End Function

' ------------------------------------------------------
' Filter 过滤器语义操作
' ------------------------------------------------------
' ==================================
' 原地操作
' ==================================
' 返回自身
' 为当前 FilterCol 设置别名
' @param name 别名
' @return 返回当前 FilterCol 对象自身，以完成链式调用
Public Function alias(ByRef name As String) As IDFFilterCol
End Function

' ==================================
' 生成基础运算函数列
' ==================================
' 以当前 FilterCol 为基础创建一个加法计算列
'
' @param val 计算参数
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
' @return 加法计算列
Public Function add(ByRef val As Variant) As IDFFilterCol
End Function

' 以当前 FilterCol 为基础创建一个减法计算列
'
' @param val 计算参数
'            可以是基础类型（只对 INT、DECIMAL 类型有效，其他类型抛出异常）、
'            IDFFilterCol类型(和另一个列进行计算)
' @return 减法计算列
Public Function subtract(ByRef val As Variant) As IDFFilterCol
End Function

' 以当前 FilterCol 为基础创建一个乘法计算列
'
' @param val 计算参数
'            可以是基础类型（只对 INT、DECIMAL 类型有效，其他类型抛出异常）、
'            IDFFilterCol类型(和另一个列进行计算)
' @return 乘法计算列
Public Function multiply(ByRef val As Variant) As IDFFilterCol
End Function

' 以当前 FilterCol 为基础创建一个除法计算列
'
' @param val 计算参数
'            可以是基础类型（只对 INT、DECIMAL 类型有效，其他类型抛出异常）、
'            IDFFilterCol类型(和另一个列进行计算)
' @return 除法计算列
Public Function divide(ByRef val As Variant) As IDFFilterCol
End Function

' 以当前 FilterCol 为基础创建一个字符串连接计算列
' @param val 计算参数
'            可以是基础类型（必须是字符串）、IDFFilterCol类型(和另一个列进行计算)
' @return 字符串连接计算列
Public Function concat(ByRef val As Variant) As IDFFilterCol
End Function

' ==================================
' 生成聚合函数列
' ==================================
' 在当前 FilterCol 的基础上生成最小值计算列
'
' @return IDFFilterCol + IDFFilterAggCol 最小值计算列
Public Function min() As IDFFilterCol
End Function

' 在当前 FilterCol 的基础上生成最大值计算列
'
' @return IDFFilterCol + IDFFilterAggCol 最大值计算列
Public Function max() As IDFFilterCol
End Function

' 在当前 FilterCol 的基础上生成求和计算列
'
' @return IDFFilterCol + IDFFilterAggCol 求和计算列
Public Function sum() As IDFFilterCol
End Function

' 在当前 FilterCol 的基础上生成求和计算列
'
' @return IDFFilterCol + IDFFilterAggCol 求和计算列
Public Function agg() As IDFFilterCol
End Function

' ==================================
' 条件生成器
' ==================================
' = 运算
'
' @param val 比较参数
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function eq(ByRef val As Variant) As IDFFilterColCondition
End Function

' != 运算
'
' @param val 比较参数
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function ne(ByRef val As Variant) As IDFFilterColCondition
End Function

' > 运算
'
' @param val 比较参数
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function gt(ByRef val As Variant) As IDFFilterColCondition
End Function

' < 运算
'
' @param val 比较参数
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function lt(ByRef val As Variant) As IDFFilterColCondition
End Function

' >= 运算
'
' @param val 比较参数
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function ge(ByRef val As Variant) As IDFFilterColCondition
End Function

' <= 运算
'
' @param val 比较参数
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function le(ByRef val As Variant) As IDFFilterColCondition
End Function

' in() 运算
'
' @param vs 比较参数数组
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function inVals(ByRef vs As Variant) As IDFFilterColCondition
End Function

' between 运算
'
' @param left 左值
' @param right 右值
'            可以是基础类型、IDFFilterCol类型(和另一个列进行计算)
'            不能是 IDFFilterAggCol 聚合计算列，如果使用了将会抛出异常
Public Function between(ByRef left As Variant, ByRef right As Variant) As IDFFilterColCondition
End Function
